package com.example.archive.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.archive.entity.SystemLog;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

/**
 * 系统日志数据访问层接口
 * 继承MyBatis Plus的BaseMapper，提供基础CRUD操作
 * 同时定义自定义查询方法
 */
@Mapper
public interface SystemLogMapper extends BaseMapper<SystemLog> {
    
    /**
     * 分页查询系统日志（带用户名）
     * 关联查询users表获取用户名
     * 当name为null时使用username，都为null时显示"系统"
     * 按时间倒序排列
     * 
     * @param page MyBatis Plus分页对象
     * @return 分页查询结果
     */
    @Select("SELECT sl.*, COALESCE(u.name, u.username, '系统') as username FROM system_logs sl " +
            "LEFT JOIN users u ON sl.user_id = u.user_id " +
            "ORDER BY sl.timestamp DESC")
    Page<SystemLog> selectLogsWithUsername(Page<SystemLog> page);
    
    /**
     * 分页查询系统日志（带查询条件 - 仅操作类型）
     * 支持按操作类型筛选
     * 
     * @param page MyBatis Plus分页对象
     * @param action 操作类型
     * @return 分页查询结果
     */
    @Select("SELECT sl.*, COALESCE(u.name, u.username, '系统') as username FROM system_logs sl " +
            "LEFT JOIN users u ON sl.user_id = u.user_id " +
            "WHERE sl.action = #{action} " +
            "ORDER BY sl.timestamp DESC")
    Page<SystemLog> selectLogsByAction(Page<SystemLog> page, @Param("action") String action);
    
    /**
     * 分页查询系统日志（带查询条件 - 时间范围）
     * 支持按时间范围筛选
     * 
     * @param page MyBatis Plus分页对象
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 分页查询结果
     */
    @Select("SELECT sl.*, COALESCE(u.name, u.username, '系统') as username FROM system_logs sl " +
            "LEFT JOIN users u ON sl.user_id = u.user_id " +
            "WHERE sl.timestamp >= #{startTime} AND sl.timestamp <= #{endTime} " +
            "ORDER BY sl.timestamp DESC")
    Page<SystemLog> selectLogsByTimeRange(Page<SystemLog> page, 
                                        @Param("startTime") String startTime, 
                                        @Param("endTime") String endTime);
    
    /**
     * 分页查询系统日志（带查询条件 - 操作类型和时间范围）
     * 支持按操作类型和时间范围筛选
     * 
     * @param page MyBatis Plus分页对象
     * @param action 操作类型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 分页查询结果
     */
    @Select("SELECT sl.*, COALESCE(u.name, u.username, '系统') as username FROM system_logs sl " +
            "LEFT JOIN users u ON sl.user_id = u.user_id " +
            "WHERE sl.action = #{action} AND sl.timestamp >= #{startTime} AND sl.timestamp <= #{endTime} " +
            "ORDER BY sl.timestamp DESC")
    Page<SystemLog> selectLogsByActionAndTimeRange(Page<SystemLog> page, 
                                                 @Param("action") String action,
                                                 @Param("startTime") String startTime, 
                                                 @Param("endTime") String endTime);
} 